package demo;

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import com.xiaren.common.ImageManager;

import javax.imageio.ImageIO;

public class ImageViewer extends Frame {
	private Image image;

	/** * 显示一个图像 * @param viewMe */
	public ImageViewer(Image viewMe) {
		image = viewMe;
		MediaTracker mediaTracker = new MediaTracker(this);
		mediaTracker.addImage(image, 0);
		try {
			mediaTracker.waitForID(0);
		} catch (InterruptedException ie) {
			ie.printStackTrace();
			System.exit(1);
		}
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		}); // 窗口适应图像大小
		setSize(image.getWidth(null), image.getHeight(null)); // 窗口标题
		setTitle("Viewing Image from Clipboard");
		setVisible(true);

		// 图片保留本地
		BufferedImage bi = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
		Graphics2D g2d = bi.createGraphics();
		g2d.drawImage(image,0,0,null);
		g2d.dispose();
		try {
			ImageIO.write(bi,"png",new File("out.png"));
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public void paint(Graphics graphics) {
		graphics.drawImage(image, 0, 0, null);
	}

	/** * 用于读取图像文件并生成Image对象 */
	public static Image getImageFromFile(String fileName) {
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Image image = toolkit.getImage(fileName);
		return image;
	}

	/** 从指定的剪切板中获取文本内容 */
	protected static String getClipboardText(Clipboard clip) throws Exception { // 获取剪切板中的内容
		Transferable clipT = clip.getContents(null);
		if (clipT != null) { // 检查内容是否是文本类型
			if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))
				return (String) clipT.getTransferData(DataFlavor.stringFlavor);
		}
		return null;
	}

	/** 2. 往剪切板写文本数据 */
	protected static void setClipboardText(Clipboard clip, String writeMe) {
		Transferable tText = new StringSelection(writeMe);
		clip.setContents(tText, null);
	}

	/** 3. 从剪切板读取图像 */
	public static Image getImageFromClipboard() throws Exception {
		Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable cc = sysc.getContents(null);
		if (cc == null)
			return null;
		else if (cc.isDataFlavorSupported(DataFlavor.imageFlavor))
			return (Image) cc.getTransferData(DataFlavor.imageFlavor);
		return null;
	}

	/** 4. 写图像到剪切板 */
	protected static void setClipboardImage2(final Image image) {
		Transferable trans = new Transferable() {
			public DataFlavor[] getTransferDataFlavors() {
				return new DataFlavor[] { DataFlavor.imageFlavor };
			}

			public boolean isDataFlavorSupported(DataFlavor flavor) {
				return DataFlavor.imageFlavor.equals(flavor);
			}

			public Object getTransferData(DataFlavor flavor)
					throws UnsupportedFlavorException, IOException {
				if (isDataFlavorSupported(flavor))
					return image;
				throw new UnsupportedFlavorException(flavor);
			}
		};
		Toolkit.getDefaultToolkit().getSystemClipboard()
				.setContents(trans, null);
	}

	public static void main(String[] args) throws Exception {
		Image img = ImageManager.IMAGE_TITLE.getImage().getScaledInstance(ImageManager.MaxHeight, ImageManager.MaxHeight,
				Image.SCALE_DEFAULT);
		new ImageViewer(getImageFromClipboard());
	}

}